const fp = require('lodash/fp')

class IO {
  static of(value) {
    // 本来是直接返回值
    // 变成了返回一个函数 确认正确再取值
    return new IO(function () {
      return value
    })
  }
  constructor(fn) {
    this._value = fn
  }
  map(fn) {
    // (fn,this._value) 而不是 fn(this._value)
    // 不是调用函数处理值 而是组合成一个新的函数
    // 调用new 构造函数 而不是map方法
    // 主要是因为当前的value是一个函数function () { return value }
    return new IO(fp.flowRight(fn, this._value))
  }
}
// 调用
// of的时候吧值包装到了函数里面
let r = IO.of(process).map((x) => x.execPath)
console.log(r) // IO { _value: [Function (anonymous)] }
// 副作用就在_value里面了 前面返回IO函子是纯函数不可能有问题的 _value是函数的组合
console.log(r._value()) // C:\Program Files\nodejs\node.exe
